﻿#ifndef __USART_H__
#define __USART_H__


#include <stdint.h>
#include "stm32f10x.h"

typedef enum
{
    USART_IND1,      // 对应USART1
    USART_IND2,      // 对应USART2
    USART_IND3,      // 对应USART3
    USART_IND_END    // 最大索引
}UsartIndex_t;

typedef struct
{
    uint32_t baudrate;             /*!< 波特率 */
    uint32_t databits;             /*!< 数据位 */
    uint32_t parity;               /*!< 校验位 */
    uint32_t stopbits;             /*!< 停止位 */
    void     (*GpioConfig)(void) ; /*!< GPIO配置 */
}UsartContig_t;

typedef struct UsartType
{
    USART_TypeDef       *usartx;                  /*!< 外设号 */
    UsartIndex_t        index;                    /*!< 索引 */
    DMA_TypeDef         *dmax;                    /*!< DMA号 */
    DMA_Channel_TypeDef *dma_chx;                 /*!< DMA通道号 */
    uint8_t             *recive_buffer[2];        /*!< 接收缓冲区 */
    uint32_t            recive_buffer_size;       /*!< 接收缓冲区大小 */
    volatile            uint32_t recive_len;      /*!< 接收数据长度 */
    volatile            int8_t   recive_full_ptr; /*!< 接收缓冲区满指针,
                                                 -1: 无数据, 0: 缓冲区0满, 1: 缓冲区1满 */
    volatile   uint8_t  recive_wirt_ptr;         /*!< 接收缓冲区写指针,
                                                         0: 缓冲区0, 1: 缓冲区1 */
    void (*RecvCb)(void);                        /*!< 接收中断回调 */
}UsartType_t;


int Usart_Constructor(UsartType_t *instance, USART_TypeDef *usart_periph, uint32_t recive_buffer_size);
void Usart_Destructor(UsartType_t *instance);
int Usart_Init(const UsartType_t *instance, const UsartContig_t *config);
void USART_IdleDmaInit(const UsartType_t *instance);
int USART_Send(const UsartType_t *instance, uint8_t *data, uint32_t size, uint32_t timeout);
int USART_ReadFromDma(UsartType_t *instance, uint8_t *data);

#endif // USART_H

